自定义UDF函数
UDF函数分为UDF,UDAF,UDTF 3种类型
- UDF 函数 1进一出
- UDAF 函数 多进一出 类似group by 后 sum 聚合
- UDTF函数 一进多出
这里主要介绍UDF 函数的开发。每创建一个UDF函数,需要创建一个UDF类,UDF类需要集成如下两个类中的一个: - org.apache.hadoop.hive.ql.exec.UDF
- org.apache.hadoop.hive.ql.udf.generic.GenericUDF
集成UDF类,在类中可以定义一个或者多个名称为evaluate的方法,方法可以定义0个或者多个参数,
方法需要定义返回类型:
public int evaluate(int a);}
public double evaluate(int a, double b);}
public String evaluate(String a, int b, Text c);}
public Text evaluate(String a);}
public String evaluate(List<Integer> a);}
**UDF实例**
定义一个md5函数,调用md5函数时,可以缺省第二个参数
public class HashMd5UDF extends UDF {
/**
*
* @param value
* @return
*/
public String evaluate(String value) {
return Hashing.md5().hashString(value).toString();
}
/**
*
* @param value
* @param charsetName
* @return
*/
public String evaluate(String value, String charsetName) {
return Hashing.md5().hashString(value, Charset.forName(charsetName)).toString();
}
}
GenericUDF
适合需要处理数据库连接场景使用,例如:
/**[参考文档](<http://lxw1234.com/archives/2015/08/454.htm>)
*
*/
public class HashMd5GenericUDF extends GenericUDF {
private static final Logger LOGGER = LoggerFactory.getLogger(HashMd5GenericUDF.class);
/**
* 函数初始化操作,并定义函数的返回值类型;
* 比如,在该方法中可以初始化对象实例,初始化数据库链接,初始化读取文件等;
*
* @param arguments
* @return
* @throws UDFArgumentException
*/
@Override
public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
LOGGER.info("init...");
//函数返回类型为String
ObjectInspector returnType = PrimitiveObjectInspectorFactory
.getPrimitiveJavaObjectInspector(PrimitiveObjectInspector.PrimitiveCategory.STRING);
return returnType;
}
/**
* 函数处理的核心方法,用途和UDF中的evaluate一样;
*
* @param args
* @return
* @throws HiveException
*/
@Override
public Object evaluate(DeferredObject[] args) throws HiveException {
if(args.length < 1 || args.length > 2)
throw new IllegalArgumentException("参数个数不能小于1,大于三");
String value = args[0].get().toString();
String charsetName = null;
if( args.length == 2) {
charsetName = args[1].get().toString();
return Hashing.md5().hashString(value, Charset.forName(charsetName)).toString();
} else {
return Hashing.md5().hashString(value).toString();
}
}
/**
* 显示函数的帮助信息
*
* @param children
* @return
*/
@Override
public String getDisplayString(String[] children) {
return "Usage: md5(String)";
}
/**
* 任务完成后,执行关闭操作
*
* @throws IOException
*/
@Override
public void close() throws IOException {
LOGGER.info("close...");
}
}
函数资源打包
使用maven-shade-plugin 打包,把引入的第三方jar合并打成一个jar包,但hive,hadoop 等jar不需要打入,避免生成的jar很大。 mvn clean package